#define  _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstring>
using namespace std;
using LL = long long;

const int N = 55;
const int MOD = 1000000007;
int n, m, k;
int c[N][N];
LL dp[N][N][13][14]; // dp[x][y][cnt][max_val]

LL dfs(int x, int y, int cnt, int max_val) {
    // 到达终点
    if (x == n && y == m) {
        //拿宝贝
        int cnt_ = cnt;
        if (c[n][m] > max_val)
            cnt_++;
        return (cnt == k || cnt_ == k)? 1 : 0;
    }
    // 越界或超过 k 个宝贝
    if (x > n || y > m || cnt > k) {
        return 0;
    }
    // 已经计算过
    if (dp[x][y][cnt][max_val + 1] != -1) {
        return dp[x][y][cnt][max_val + 1];
    }

    LL res = 0;
    // 向右走
    if (y < m) {
        // 不拿当前格子
        res = (res + dfs(x, y + 1, cnt, max_val)) % MOD;
        // 如果可以拿当前格子
        if (c[x][y] > max_val) {
            res = (res + dfs(x, y + 1, cnt + 1, c[x][y])) % MOD;
        }
    }
    // 向下走
    if (x < n) {
        // 不拿当前格子
        res = (res + dfs(x + 1, y, cnt, max_val)) % MOD;
        // 如果可以拿当前格子
        if (c[x][y] > max_val) {
            res = (res + dfs(x + 1, y, cnt + 1, c[x][y])) % MOD;
        }
    }

    return dp[x][y][cnt][max_val + 1] = res;
}

int main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> c[i][j];
        }
    }

    // 初始化 dp 数组为 -1
    memset(dp, -1, sizeof(dp));

    // 从 (1,1) 开始，初始 max_val = -1（手中没有宝贝）
    LL ans = dfs(1, 1, 0, -1);
    //ans +=   dfs(1, 1, 1, c[1][1]);
    cout << ans%MOD << endl;

    return 0;
}